package com.yc.cloud.openai.utils;

import java.io.File;
import java.nio.file.Files;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.time.Instant;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class CozeJwtUtils {

    /**
     * 生成JWT Token
     * 
     * @param appid          应用ID
     * @param kid            公钥指纹
     * @param privateKeyPath 私钥文件路径
     * @param expireSeconds  过期时间(秒)
     * @return JWT Token
     */
    public static String generateJwtToken(String appid, String kid, String privateKeyPath, int expireSeconds,String sessionName) {
        try {
            // 从文件读取私钥
            String privateKeyContent = new String(Files.readAllBytes(new File(privateKeyPath).toPath()));
            String privateKeyPEM = privateKeyContent
                    .replace("-----BEGIN PRIVATE KEY-----", "")
                    .replace("-----END PRIVATE KEY-----", "")
                    .replaceAll("\\s+", "");

            byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyPEM);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

            // 当前时间
            Instant now = Instant.now();

            // 构建JWT
            String jwtToken = Jwts.builder()
                    // Header 部分
                    .setHeaderParam("alg", "RS256")
                    .setHeaderParam("typ", "JWT")
                    // 公钥指纹
                    .setHeaderParam("kid", kid)
                    // Payload 部分
                    // 应用ID - iss
                    .setIssuer(appid) // iss: OAuth 应用的 ID
                    // 目标服务 - aud
                    .setAudience("api.coze.cn") // aud: 扣子 API 的 Endpoint
                    // 过期时间 - exp
                    .setExpiration(Date.from(now.plusSeconds(expireSeconds))) // exp: JWT过期时间
                    // 生效时间 - iat
                    .setIssuedAt(Date.from(now)) // iat: JWT开始生效时间
                    // 防重放ID - jti
                    .setId(UUID.randomUUID().toString()) // jti: 随机字符串，防止重放攻击
                    // 可选的会话标识
                    .claim("session_name", sessionName) // session_name: 可选的会话标识
                    // Signature 部分
                    .signWith(SignatureAlgorithm.RS256, privateKey)
                    .compact();

            return jwtToken;
        } catch (Exception e) {
            log.error("生成JWT Token失败", e);
            return null;
        }
    }
}